package net.serenitybdd.integration.jenkins.environment.rules; import net.serenitybdd.integration.jenkins.JenkinsInstance; import org.junit.rules.TestRule; import org.junit.rules.TestWatcher; import org.junit.runner.Description; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import static java.lang.String.format; public class SandboxJenkinsHome implements ApplicativeTestRule<JenkinsInstance> { private static final Logger Log = LoggerFactory.getLogger(SandboxJenkinsHome.class); private final Path rootDirectory; public static SandboxJenkinsHome useATemporaryDirectoryUnder(Path rootDirectory) { return new SandboxJenkinsHome(rootDirectory); } public SandboxJenkinsHome(Path rootDirectory) { this.rootDirectory = rootDirectory; } @Override public TestRule applyTo(final JenkinsInstance jenkins) { return new TestWatcher() { @Override protected void starting(Description test) { Path jenkinsHome = temporaryJenkinsHomeFor(test); Log.info("Setting jenkins home to {}", jenkinsHome); jenkins.setHome(jenkinsHome); } }; } private Path temporaryJenkinsHomeFor(Description test) { try { return Files.createTempDirectory( Files.createDirectories(rootDirectory), fileSystemSafeNameOf(test) + "_" ); } catch (IOException e) { throw new RuntimeException(format("Couldn't create a temporary directory for '%s' at '%s'.", test, rootDirectory), e); } } private String fileSystemSafeNameOf(Description description) { return format("%s_%s", simplified(description.getClassName()), description.getMethodName() ); } private String simplified(String className) { return className.substring(className.lastIndexOf(".") + 1); } }